// 内容脚本 - Content Script
import { extractArticleContent } from "./extractor";
import { renderTranslation } from "./renderer";
import { getTranslation } from "../utils/storage";
import { jsPDF } from "jspdf";
import { addChineseFontToJsPDF, setChineseFont } from "../utils/chineseFont";
import {
  showLoading,
  hideLoading,
  showProgressLoading,
  updateProgress,
  updateLoading,
  isLoadingVisible,
  showSuccessMessage,
  showErrorMessage,
} from "./loading";

let isTranslating = false;
let translationVisible = false;

// 调试辅助函数
function debug(message, data) {
  const prefix = "[DeepSeek翻译]";
  if (data !== undefined) {
    console.log(`${prefix} ${message}`, data);
  } else {
    console.log(`${prefix} ${message}`);
  }
}

// 监听来自popup的消息
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  debug("收到消息", request);
  if (request.action === "translate") {
    handleTranslate()
      .then((result) => {
        debug("翻译完成", result);
        sendResponse({ success: true });
      })
      .catch((error) => {
        debug("翻译错误", error);
        sendResponse({ success: false, error: error.message });
      });
    return true; // 表示将异步发送响应
  }

  if (request.action === "download") {
    // 仅保留消息转发到后台脚本的逻辑
    chrome.runtime.sendMessage(
      {
        action: "download",
        format: request.format,
        title: document.title,
      },
      (response) => {
        debug("下载消息已转发", response);
        sendResponse(response);
      }
    );
    return true;
  }

  // 处理来自后台脚本的PDF下载请求
  if (request.action === "downloadPDF") {
    debug("收到PDF下载请求", request);
    handleDirectPDFDownload(request.content, request.title)
      .then((result) => {
        debug("PDF下载完成", result);
        sendResponse({ success: true });
      })
      .catch((error) => {
        debug("PDF下载错误", error);
        sendResponse({ success: false, error: error.message });
      });
    return true;
  }
});

// 处理翻译请求
async function handleTranslate() {
  try {
    // 防止重复翻译
    if (isTranslating) {
      throw new Error("正在翻译中，请稍候...");
    }

    isTranslating = true;
    debug("开始翻译流程");
    showProgressLoading("正在准备翻译...");

    // 首先检查是否已有翻译结果缓存
    const tabId = await getCurrentTabId();
    debug("当前标签页ID", tabId);
    let translatedContent = await getTranslation(tabId);

    // 如果没有缓存的翻译结果，则提取内容并发送翻译请求
    if (!translatedContent) {
      debug("无缓存，开始提取内容");
      updateProgress(10);
      updateLoading("正在提取文章内容...");

      // 提取网页正文内容
      const articleContent = extractArticleContent();
      debug("提取的内容长度", articleContent?.length || 0);

      if (!articleContent) {
        hideLoading();
        throw new Error("无法提取文章内容");
      }

      updateProgress(30);
      updateLoading("正在翻译文章...");
      debug("开始调用API翻译");

      // 发送翻译请求到后台脚本
      const response = await chrome.runtime.sendMessage({
        action: "translate",
        content: articleContent,
      });

      if (!response.success) {
        hideLoading();
        throw new Error(response.error || "翻译失败");
      }

      translatedContent = response.data;
      debug("翻译结果长度", translatedContent.length);
      updateProgress(80);
    } else {
      debug("使用缓存的翻译结果");
    }

    updateProgress(90);
    updateLoading("正在渲染翻译结果...");
    debug("开始渲染翻译结果");

    try {
      // 渲染翻译结果
      await renderTranslation(translatedContent);
      translationVisible = true;

      debug("渲染完成");

      // 确保在渲染完成后再隐藏加载状态
      // 使用强制的方式确保加载状态被隐藏
      forceHideLoading();
    } catch (renderError) {
      console.error("渲染翻译结果时出错:", renderError);
      debug("渲染翻译出错", renderError);
      hideLoading();
      throw new Error("渲染翻译结果失败: " + renderError.message);
    }

    // 通知popup更新状态
    chrome.runtime.sendMessage({
      action: "translationComplete",
      tabId: tabId,
    });
    debug("翻译流程完成");

    return true;
  } catch (error) {
    console.error("翻译过程中发生错误:", error);
    debug("翻译过程中发生错误", error);
    // 显示错误提示
    showErrorMessage(error.message);
    hideLoading();
    throw error;
  } finally {
    isTranslating = false;
  }
}

// 直接处理PDF下载
async function handleDirectPDFDownload(content, title) {
  try {
    debug("开始直接PDF下载");
    showLoading("正在准备下载PDF文件...");

    // 创建PDF文档
    const pdf = new jsPDF({
      orientation: "portrait", // 纵向
      unit: "mm", // 单位为毫米
      format: "a4", // A4纸大小
    });

    // 添加中文字体支持
    debug("添加中文字体支持");
    const fontAdded = addChineseFontToJsPDF(pdf);
    if (!fontAdded) {
      throw new Error("无法添加中文字体");
    }

    // 设置中文字体
    setChineseFont(pdf);

    // 处理HTML内容为纯文本
    const textContent = content
      .replace(/<[^>]*>/g, " ")
      .replace(/\s+/g, " ")
      .trim();

    debug("准备PDF文本内容，长度：", textContent.length);

    // 设置字体大小
    pdf.setFontSize(12);

    // 计算页面尺寸和边距
    const pageWidth = pdf.internal.pageSize.getWidth();
    const pageHeight = pdf.internal.pageSize.getHeight();
    const margin = 20; // 页面边距，单位毫米
    const contentWidth = pageWidth - 2 * margin;

    // 添加标题
    pdf.setFontSize(16);
    pdf.text(title || "DeepSeek翻译", pageWidth / 2, margin, {
      align: "center",
    });

    // 重置字体大小
    pdf.setFontSize(12);

    // 分割文本为行并添加到PDF
    const lines = splitTextIntoLines(textContent, 100); // 每行大约100个字符
    let y = margin + 15; // 从标题下方开始
    const lineHeight = 7; // 行高

    for (const line of lines) {
      // 如果即将超出页面边界，添加新页
      if (y + lineHeight > pageHeight - margin) {
        pdf.addPage();
        y = margin; // 重置到新页面顶部
      }

      // 添加文本行
      pdf.text(line, margin, y);
      y += lineHeight;
    }

    // 生成文件名
    const timestamp = new Date()
      .toISOString()
      .replace(/[:.]/g, "-")
      .substring(0, 19);
    const cleanTitle = (title || "DeepSeek翻译")
      .replace(/[\\/:*?"<>|]/g, "_")
      .substring(0, 50);
    const fileName = `${cleanTitle}_${timestamp}.pdf`;

    debug("保存PDF文件：", fileName);

    // 保存PDF
    pdf.save(fileName);

    // 隐藏加载状态
    hideLoading();

    // 显示成功消息
    showSuccessMessage("PDF文件下载成功");

    return true;
  } catch (error) {
    console.error("PDF下载过程中发生错误:", error);
    debug("PDF下载错误", error);
    hideLoading();
    showErrorMessage(error.message);
    throw error;
  }
}

// 将文本分割成行
function splitTextIntoLines(text, maxCharsPerLine) {
  const words = text.split(" ");
  const lines = [];
  let currentLine = "";

  for (const word of words) {
    if ((currentLine + word).length > maxCharsPerLine) {
      lines.push(currentLine);
      currentLine = word + " ";
    } else {
      currentLine += word + " ";
    }
  }

  if (currentLine.trim().length > 0) {
    lines.push(currentLine);
  }

  return lines;
}

// 强制隐藏加载状态，确保即使常规方法失败也能移除加载状态
function forceHideLoading() {
  debug("强制隐藏加载状态");

  // 先尝试常规方法
  hideLoading();

  // 检查是否仍然可见
  if (isLoadingVisible()) {
    debug("常规方法失败，尝试直接DOM操作");

    // 延迟执行，确保DOM操作完成
    setTimeout(() => {
      try {
        const loadingElement = document.getElementById(
          "deepseek-translate-loading"
        );
        if (loadingElement) {
          // 尝试多种移除方法
          if (typeof loadingElement.remove === "function") {
            loadingElement.remove();
          } else if (loadingElement.parentNode) {
            loadingElement.parentNode.removeChild(loadingElement);
          }
          debug("强制移除成功");
        }
      } catch (error) {
        debug("强制移除失败", error);
      }
    }, 100);
  }
}

// 获取当前标签页ID
async function getCurrentTabId() {
  return new Promise((resolve) => {
    chrome.runtime.sendMessage({ action: "getTabId" }, (response) => {
      resolve(response.tabId);
    });
  });
}
